﻿//Código desenvolvido na integra por João Ribeiro
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Windows.Forms;

namespace GestaoContas
{
    class ContaLogin
    {
        MembershipUser _user;

        private string _userId;

        public string UserId
        {
            get { return _userId; }
            set { _userId = value; }
        }

        private string _nomeUtilizador;

        public string NomeUtilizador
        {
            get { return _nomeUtilizador; }
            set { _nomeUtilizador = value; }
        }

        private string _password;

        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }

        private string _passAntiga;

        public string PassAntiga
        {
            get { return _passAntiga; }
            set { _passAntiga = value; }
        }

        private string _passConfirma;

        public string PassConfirma
        {
            get { return _passConfirma; }
            set { _passConfirma = value; }
        }
        
        private string _email;

        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }

        private bool _contaActiva;

        public bool ContaActiva
        {
            get { return _contaActiva; }
            set { _contaActiva = value; }
        }

        private string _roleDeUtilizador;

        public string RoleDeUtilizador
        {
            get { return _roleDeUtilizador; }
            set { _roleDeUtilizador = value; }
        }

        public ContaLogin(string userId)
        {
            Guid guidUserId = new Guid(userId);
            _userId = userId;
            _nomeUtilizador = Membership.GetUser(guidUserId).UserName;
            _user = Membership.GetUser(_nomeUtilizador);
            _contaActiva = _user.IsApproved;
            _email = _user.Email;
        }

        public ContaLogin(string userId, string role, string email)
        {
            Guid guidUserId = new Guid(userId);
            _userId = userId;
            _nomeUtilizador = Membership.GetUser(guidUserId).UserName;
            _roleDeUtilizador = role;
            _user = Membership.GetUser(_nomeUtilizador);
            _email = email;
            _contaActiva = _user.IsApproved;
        }

        public ContaLogin(string userId, string userName, bool contaActiva, string role, string email, string passAntiga, string password, string passConfirma)
        {
            _userId = userId;
            _nomeUtilizador = userName;
            _contaActiva = contaActiva;
            _roleDeUtilizador = role;
            _email = email;
            _passAntiga = passAntiga;
            _password = password;
            _passConfirma = passConfirma;
            _user = Membership.GetUser(userName);
        }


        /// <summary>
        /// Altera a password do utilizador.
        /// </summary>
        /// <param name="antigaPass">Password antiga</param>
        /// <param name="novaPass">Nova password</param>
        /// <param name="novaPassConfirmada">Confirmação da password</param>
        /// <returns>True, se foi alterada com sucesso</returns>
        public bool AlteraPassword(string antigaPass, string novaPass, string novaPassConfirmada)
        {
            bool passAlterada = false;
            if (novaPass == novaPassConfirmada && novaPass.Length > 0)
            {
                try
                {
                    passAlterada = _user.ChangePassword(antigaPass, novaPass);
                    Membership.UpdateUser(_user);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro na alteração da password");
                }
            }
            else
            {
                MessageBox.Show("Password inválida");
            }
            if(passAlterada)
            {
                _password = novaPass;
            }

            return passAlterada;
        }

        /// <summary>
        /// Altera a role do utilizador.
        /// </summary>
        /// <param name="novaRole">nova role</param>
        public void AlteraRole(string roleAntiga)
        {
            Roles.RemoveUserFromRole(_nomeUtilizador, roleAntiga);
            Roles.AddUserToRole(_nomeUtilizador, _roleDeUtilizador);
            Membership.UpdateUser(_user);
        }


        /// <summary>
        /// Altera o email do utilizador.
        /// </summary>
        /// <param name="novoEmail"></param>
        public void AlteraEmail(string novoEmail)
        {
            _user.Email = novoEmail;
            _email = novoEmail;
            Membership.UpdateUser(_user);
        }

        /// <summary>
        /// Activa ou desactiva a conta do utilizador.
        /// </summary>
        /// <param name="contaActiva">True para activar a conta; False, caso contrário</param>
        public void AlteraActivacao(bool contaActiva)
        {
            _user.IsApproved = contaActiva;
            _contaActiva = contaActiva;
            Membership.UpdateUser(_user);
        }

        /// <summary>
        /// Compara com os dados do login antes da alteração para verificar se realmente existiu alguma 
        /// alteração nos campos.
        /// </summary>
        /// <param name="contaAntiga">False, caso tenha havido alguma alteração</param>
        /// <returns></returns>
        public bool Igual(ContaLogin contaAntiga)
        {
            bool contaIgual = true;
            if (_roleDeUtilizador != contaAntiga.RoleDeUtilizador ||
                _contaActiva != contaAntiga.ContaActiva ||
                _email != contaAntiga.Email ||
                _passAntiga.Length > 0)
            {
                contaIgual = false;
            }

            return contaIgual;
        }

        /// <summary>
        /// Verifica qual ou quais os campos foram alterados, e grava as alterações
        /// </summary>
        /// <param name="contaAntiga"></param>
        public bool GravaAlteracoesLogin(ContaLogin contaAntiga)
        {
            bool alterado = false;
            if (_roleDeUtilizador != contaAntiga.RoleDeUtilizador)
            {
                AlteraRole(contaAntiga.RoleDeUtilizador);
                alterado = true;
            }
            if (_contaActiva != contaAntiga.ContaActiva)
            {
                AlteraActivacao(_contaActiva);
                alterado = true;
            }
            if (_email != contaAntiga.Email)
            {
                AlteraEmail(_email);
                alterado = true;
            }
            if (_passAntiga.Length > 0)
            {
                alterado = AlteraPassword(_passAntiga, _password, _passConfirma);
            }
            return alterado;
        }
    }
}
